// 任务1：创建一个简单的问候函数
// 创建函数
function greet(name) {
  return `Hello, [${name}]! Welcome to JavaScript.`;
}
// 调用函数（传入名字）
console.log(greet("小明"));

// 任务2：计算数组的平均值
// 创建函数
function calculateAverage(arr) {
  // 定义求和变量
  let sum = 0;
  // 遍历求和
  arr.forEach((element) => {
    sum += element;
  });
  // 返回平均值
  return sum / arr.length;
}
// 创建数组
const arr = [10, 4, 5, 6, 9];
// 调用函数（传入数组）
console.log(`数组的平均值为：${calculateAverage(arr)}`);

// 任务3：检查字符串是否为回文
// 创建函数
function isPalindrome(text) {
  return text.split("").reverse().join("") != text
    ? "该字符串不是回文"
    : "该字符串是回文";
}
// 创建字符串
const text = "level";
// 调用函数（传入字符串）
console.log(isPalindrome(text));

// 任务4：实现一个简单的计数器
// 创建函数
function Counter() {
  // 创建计数变量
  let count = 0;

  // 返回计数值
  return function () {
    return count++; // 返回计数值加1
  };
}
// 创建计数器函数
const count = Counter();
// 每秒调用一次计数器
setInterval(() => console.log(count()), 1000);

// 任务5：过滤数组中的偶数
// 创建函数
function filterEvenNumbers(arr) {
  return arr.filter((item) => item % 2 == 0);
}
// 调用函数（传入数组）
console.log(
  "返回一个只包含偶数的新数组：",
  filterEvenNumbers([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
);

// 任务6：实现一个简单的对象工厂
// 创建函数
function createPerson(name, age) {
  return { name: name, age: age };
}
// 调用函数（传入姓名、年龄）
console.log("创建的对象信息：", createPerson("小明", 18));

// 任务7：递归计算阶乘
// 创建函数
function factorial(n) {
  // n 为负数直接跳出函数
  if (n < 0) return "n 必须为非负数~";
  // 返回 1
  if (n === 0 || n === 1) {
    return 1;
  }
  // 递归
  return n * factorial(n - 1);
}
// 调用函数（传入数字）
console.log("阶乘计算结果为：", factorial(4));

// 任务8：实现一个简单的事件监听器
// 获取标签
const clickDiv = document.querySelector("#clickDiv");
// 绑定点击事件
clickDiv.addEventListener("click", () => {
  // 回调函数（传入函数）
  message(() => {
    alert("你点击了该标签");
  });
});
// 创建函数（参数是函数）
function message(callback) {
  // 执行回调函数
  callback();
}

// 任务9：实现一个简单的Promise
// 创建函数
function fetchData() {
  // 创建并返回 Promise
  return new Promise((resolve, reject) => {
    // 异步函数
    setTimeout(() => {
      const success = true;
      if (success) {
        // 返回成功字符串
        resolve("获取成功");
      } else {
        // 抛出错误
        reject(new Error("获取失败"));
      }
    }, 1000);
  });
}
// 调用函数
fetchData()
  .then((message) => console.log(message))
  .catch((error) => console.error(error.message));

// 任务10：实现一个简单的模块
// 创建模块
const mathUtils = (function () {
  // 私有的内容
  function private_add(a, b) {
    return a + b;
  }

  function private_multiply(a, b) {
    return a * b;
  }

  // 调用 私有的方法 并返回一个对象方法
  return {
    add: function (a, b) {
      return private_add(a, b);
    },
    multiply: function (a, b) {
      return private_multiply(a, b);
    },
  };
})();

// 使用模块（选择需要的对象方法并传入参数）
console.log("加法运算结果为：", mathUtils.add(1, 7));
console.log("乘法运算结果为；", mathUtils.multiply(6, 6));
